<?php

namespace app\models;

use Yii;
use \yii\db\ActiveRecord;

class AdminUser extends ActiveRecord{

    public $username;
    public $password;
    private $_username = false;
    public $rememberMe = true;

    /**
     * @return string 返回该AR类关联的数据表名
     */
    public static function tableName()
    {
        return '{{%admin}}';
    }

    /**
     * @return array 返回rules验证规则
     * 每一个规则，都形如一个小数组，可以分为四个部分，
     * 1为需要验证的属性
     * 2为规则的类型，它可以是一个类名，或者验证的别名，或者是验证方法的方法名
     * 3为哪一个场景执行这个验证规则，如果忽略则默认所有，'on' => ['scenario1', 'scenario2', ...],
     * 也可以用except
     * 4指定额外的配置
     * 1，2为必填项，3,4为可选项
     */

    /**
     * 可以通过message属性来定制某个规则的错误信息
     */

    /**
     * 数据预处理 比如trim，default这些并不会真的对输入数据进行验证，而是对输入数据经行一些处理
     */

    public function rules()
    {
        return [
            [['username','password'],'trim'],//去掉收尾空格
            [['username','password'],'default'],//空输入返回null
            ['username','required','message'=>'用户名不能为空'],
            [['username'], 'string', 'max' => 50],
            ['password','required','message'=>'请输入密码'],
            ['password','validatePassword'],
            ['rememberMe', 'boolean'],
        ];
    }
    /**
     * 行内验证器
     * 行内验证器是一种以模型方法或匿名函数的形式定义的验证器
     use yii\base\Model;

    class MyForm extends Model
    {
            public $country;
            public $token;

        public function rules()
        {
            return [
                // an inline validator defined as the model method validateCountry()
                ['country', 'validateCountry'],

                // an inline validator defined as an anonymous function
                ['token', function ($attribute, $params) {
                    if (!ctype_alnum($this->$attribute)) {
                    $this->addError($attribute, 'The token must contain letters or digits.');
                    }
                }],
            ];
        }

        public function validateCountry($attribute, $params)
        {
            if (!in_array($this->$attribute, ['USA', 'Web'])) {
            $this->addError($attribute, 'The country must be either "USA" or "Web".');
            }
        }
    }
     *
     * 缺省状态下，行内验证器不会在关联特性的输入值为空或该特性已经在其他验证中失败的情况下起效。
     * 若你想要确保该验证器始终启用的话，你可以在定义规则时，
     * 酌情将 yii\validators\Validator::skipOnEmpty 以及 yii\validators\Validator::skipOnError属性设为 false，比如，
    [
        ['country', 'validateCountry', 'skipOnEmpty' => false, 'skipOnError' => false],
    ]
     *
     */


    /**************************独立验证器**********************/




    /**
     * 数据预处理举例：
     return [
    // 若 "username" 和 "email" 为空，则设为 null
    [['username', 'email'], 'default'],

    // 若 "level" 为空，则设其为 1
    ['level', 'default', 'value' => 1],
    ];
     *
     * 在 核心验证器 之中，
     * 只有 captcha（验证码），default（默认值）， filter（滤镜），required（必填），以及 trim（去首尾空格），
     * 这几个验证器会处理空输入。
     */



    /*
     *
     * 验证事件
     * 当调用 yii\base\Model::validate() 方法的过程里，它同时会调用两个特殊的方法， 把它们重写掉可以实现自定义验证过程的目的：
     * yii\base\Model::beforeValidate()：在默认的实现中会触发 yii\base\Model::EVENT_BEFORE_VALIDATE 事件。
     * 你可以重写该方法或者响应此事件，来在验证开始之前，先进行一些预处理的工作。
     * （比如，标准化数据输入）该方法应该返回一个布尔值，用于标明验证是否通过。
     * yii\base\Model::afterValidate()：在默认的实现中会触发 yii\base\Model::EVENT_AFTER_VALIDATE 事件。
     * 你可以重写该方法或者响应此事件，来在验证结束之后， 再进行一些收尾的工作。
     */

    /**
     * @return bool
     */
    public function beforeValidate()
    {
        //p("222");
        //$this->addError("password", '密码格式不对');
        return true;
    }

    public function afterValidate()
    {
        //dd("验证成功");
    }


    /*********************条件式验证************************/



    /**
     * @param $attribute
     * @param $params
     * 验证密码
     */
    public function validatePassword($attribute, $params){
        if (!$this->hasErrors()) {
            $user = $this->getUser();
            //如果用户名为空，密码错误，只要有一个成立，就返回错误信息
            if (!$user || !($user['password']==$this->password)) {
                $this->addError($attribute, '用户名或密码错误');
            }
        }
    }

    /**
     * @return array|bool|null|ActiveRecord 根据用户名，返回user信息
     */
    public function getUser()
    {
        if ($this->_username === false) {
            $this->_username = AdminUser::findByUsername($this->username);
        }

        return $this->_username;
    }

    public function attributeLabels()
    {
        return [
            'username' => '用户名',
            'password' => '密码',
        ];
    }

    /**
     * @param $username
     * @return array|null|ActiveRecord
     * 根据填写的用户名查找
     */
    public static function findByUsername($username)
    {
        return Admin::find()->where(['username'=>$username])->asArray()->one();
    }

    public function login()
    {
        if ($this->validate()) {
            return Yii::$app->user->login(Auser::findByUsername($this->username), $this->rememberMe ? 3600*24*30 : 0);
        }
        return false;
    }


}